<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- <script>
        alert( 1 || 0 ); // 1（1 是真值）

        alert( null || 1 ); // 1（1 是第一个真值）
        alert( null || 0 || 1 ); // 1（第一个真值）

        alert( undefined || null || 0 ); // 0（所有的转化结果都是 false，返回最后一个值）
    </script> -->

    <!-- <script>
        // 如果第一个运算符是真值，与操作返回第二个操作数：
        alert( 1 && 0 ); // 0
        alert( 1 && 5 ); // 5

        // 如果第一个运算符是假值，与操作直接返回它。第二个操作数被忽略
        alert( null && 5 ); // null
        alert( 0 && "no matter what" ); // 0

        alert( 1 && 2 && null && 3 ); // null

        alert( 1 && 2 && 3 ); // 3，最后一个值
    </script> -->

    <script>
        // 与运算 && 在或运算符 || 之前执行
        // 与运算 && 的优先级比或运算 || 要高。
        // 所以代码 a && b || c && d 完全跟 && 表达式加了括号一样：(a && b) || (c && d)

        // 执行。
        // -1 || 0 的结果为 -1，真值
        if (-1 || 0) console.log( 'first' );

        // 不执行。
        // -1 && 0 = 0，假值
        if (-1 && 0) console.log( 'second' );

        // 执行
        // && 运算的优先级比 || 高
        // 所以 -1 && 1 先执行，给出如下运算链：
        // null || -1 && 1  ->  null || 1  ->  1
        if (null || -1 && 1) console.log( 'third' );
    </script>
</body>
</html>